package com.springboot.study.config;// 引入 Spring AMQP 核心包中的类，用于定义队列、交换机和绑定关系
import org.springframework.amqp.core.*;// 引入 Spring 的注解包，用于声明配置类和 Bean
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * RabbitMQ 配置类：用于配置订单相关的队列、交换机和绑定关系
 */
@Configuration // 声明这是一个配置类，Spring 容器会扫描并加载该类中的 Bean
public class RabbitConfigOrder {
    // 定义队列名称常量，便于统一管理和避免硬编码
    public static final String ORDER_QUEUE = "order.queue";
    // 定义交换机名称常量
    public static final String ORDER_EXCHANGE = "order.exchange";
    // 定义路由键常量，用于绑定队列和交换机
    public static final String ORDER_ROUTING_KEY = "order.routingkey";
    /**
     * 声明一个队列
     * @return Queue 对象
     */
    @Bean // 将方法返回的 Queue 对象注册为 Spring 容器中的 Bean
    public Queue orderQueue() {
        // 使用 QueueBuilder 构建一个持久化的队列（Durable），即 RabbitMQ 重启后队列仍然存在
        return QueueBuilder.durable(ORDER_QUEUE).build();
    }
    /**
     * 声明一个交换机
     * @return DirectExchange 对象
     */
    @Bean // 将方法返回的 DirectExchange 注册为 Spring Bean
    public DirectExchange orderExchange() {
        // 创建一个 Direct 类型的交换机，消息通过路由键精确匹配队列
        return new DirectExchange(ORDER_EXCHANGE);
    }
    /**
     * 将队列绑定到交换机，并指定路由键
     * @return Binding 对象
     */
    @Bean // 将方法返回的 Binding 注册为 Bean
    public Binding orderBinding() {
        // BindingBuilder 用于构建队列与交换机的绑定关系
        // bind(Queue)：指定要绑定的队列
        // to(Exchange)：指定绑定到的交换机
        // with(String routingKey)：指定路由键，DirectExchange 会根据路由键精确匹配队列
        return BindingBuilder.bind(orderQueue()).to(orderExchange()).with(ORDER_ROUTING_KEY);
    }
}

/*
* 每部分作用总结：
* 1、队列 (Queue)
*   订单消息的存储区域。
*   QueueBuilder.durable() 表示持久化队列，即 RabbitMQ 重启后队列仍然存在。
*   队列接收来自交换机的消息，并等待消费者消费。
*
* 2、交换机 (Exchange)
*   路由消息到指定队列的中介。
*   这里使用的是 DirectExchange，表示消息会根据路由键精确匹配队列。
*   其他类型交换机：
*       FanoutExchange：广播模式，消息发送给所有绑定的队列，不管路由键。
*       TopicExchange：支持模糊匹配路由键。
*
* 3、绑定 (Binding)
*   将队列和交换机连接起来，并通过路由键指定消息的去向。
*   在 DirectExchange 中，只有路由键完全匹配的消息才会发送到队列。
*
* 4、配置类作用
*   Spring 容器启动时，会扫描配置类，自动创建队列、交换机和绑定关系，省去手动在 RabbitMQ 管理界面创建的步骤。
*   方便在项目中直接注入使用。
* */